//package cn.itsource.zuul1020.config;
//
//import cn.itsource.basic.util.Constant;
//import cn.itsource.domain.login.LoginInfo;
//import cn.itsource.domain.org.Employee;
//import cn.itsource.util.RedisService;
//import cn.itsource.zuul1020.mapper.LoginInfoMapper;
//import com.netflix.zuul.ZuulFilter;
//import com.netflix.zuul.context.RequestContext;
//import com.netflix.zuul.exception.ZuulException;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
//import org.springframework.core.annotation.Order;
//import org.springframework.stereotype.Component;
//import org.springframework.util.StringUtils;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.util.List;
//
//
////@Order(0) 作用是区别自定义的过滤器执行顺序
////@Component
//@Slf4j
//public class MyZuulFilter extends ZuulFilter {
//
//    @Autowired
//    RedisService redisService;
//    @Autowired
//    LoginInfoMapper loginInfoMapper;
//
//    /**
//     * 作用范围
//     * @return
//     */
//    @Override
//    public String filterType() {
//        return FilterConstants.PRE_TYPE;
//    }
//    //执行顺序 越小优先级越高
//    @Override
//    public int filterOrder() {
//        return 0;
//    }
//    //是否执行run方法,如果为true 执行run方法
//    //是否执行run返回，返回true就执行run返回，false就不执行run方法
//    @Override
//    public boolean shouldFilter() {
//        //1、获取Request
//        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
//        //2、获取URL
//        String url = request.getRequestURI();
//        log.info("URL={}", url);
//        //3.判断是否包含在： static/**  ，/login , /register
//        if(url.endsWith("/login ") || url.endsWith("/register ") || url.contains("/static/") ){
//            //不需要做登录校验
//            return false;
//        }
//        //要做登录检查的返回true
//        return true;
//    }
//
//    //主业务逻辑：做登录校验
//    @Override
//    public Object run() throws ZuulException {
//        //1、获取Request
//        RequestContext context = RequestContext.getCurrentContext();
//        HttpServletRequest request = context.getRequest();
//        //2、获取URL
//        String url = request.getRequestURI();
//        HttpServletResponse response = context.getResponse();
//        //设置中文编码
//        response.setContentType("application/json;charset=utf-8");
//        //2、从请求头中获取Token
//        String token = request.getHeader("token");
//        log.info("token={}", token);
//        //3、判断有没有token
//        if(!redisService.exists(token)){
//            //登录失败，返回提示话术
//            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);//返回未登录的错误码
//            try {
//                response.getWriter().println("请登录");
//            }catch (Exception e){
//                e.printStackTrace();
//            }
//            //4、阻止filter继续往后执行
//            context.setSendZuulResponse(false);
//        }
//        //这里的返回结果没有任何意义，不用管
//
//        LoginInfo loginInfo = redisService.getKeyObjectValue(token, LoginInfo.class);
//        //todo 这里要做权限判断
//        Long id = loginInfo.getId();
//        Integer type = loginInfo.getType();
//        //这里做平台的权限判断
//        if (Constant.ZERO.equals(type)){
//            //通过员工的id 去查询对应的角色 如果角色是超管(id=1),直接放行,否则查询数据库permission表,找出对应权限完成比对
//            Integer roleId = loginInfoMapper.findByRoleId(id);
//            if (new Integer(1).equals(roleId)){
//                return null;
//            }else {
//                //不是超管 roleId 查询对应权限
//                List<String> urls = loginInfoMapper.findByPermissions(roleId);
//                if (urls.contains(url)){
//                    return null;
//                }else {
//                    try {
//                        response.getWriter().println("权限不够");
//                    }catch (Exception e){
//                        e.printStackTrace();
//                    }
//                    //4、阻止filter继续往后执行
//                    context.setSendZuulResponse(false);
//                }
//            }
//        }
//        return null;
//    }
//}
